package cn.tansanqinger.linked;


import java.util.Arrays;

interface ISingleLink<T> {
    void add(T data);//添加数据

    int size();//返回链表长度

    T[] toArray();//返回数据

    T remove(int index);//删除数据

    T set(int index, T data);//修改数据

    T put(int index);//查询数据
}

class SingleLinkImpl<T> implements ISingleLink<T> {
    private Node root;//链表的起始地址
    private Node end;//链表最后的位置
    private int size;//链表的长度

    public void add(T data) {
        Node node = new Node(data);
        if (this.root == null) {
            this.root = node;//将第一个结点交给链表起始头
            this.end = node;//尾结点也为第一个
        } else {
            this.end.node = node;//尾结点的Node存储下一个结点
            this.end = node;//尾结点后移
        }
        this.size++;//链表长度+1
    }

    public int size() {
        return this.size;//返回链表长度
    }

    public T[] toArray() {
        if (this.size == 0) {//没有数据
            return null;
        } else {
            Object result[] = new Object[this.size];//开辟数组长度
            Node list = root;
            int i = 0;
            while (list != null) {//循环遍历
                result[i++] = list.data;
                list = list.node;
            }
            return (T[]) result;//返回结果
        }
    }

    @Override
    public T remove(int index) {
        if(index == 0){
            Object data = this.root.data;
            this.root = this.root.node;//根结点后移
            this.size--;//链表长度-1
            return (T)data;
        } else{
            Node list = value(index-1);
            if(list!=null){
                Node dataNode = list; //用于获取要删除的值
                Object data = dataNode.node.data;
                list.node = list.node.node;
                this.size--;
                return (T)data;
            }
        }
        return null;
    }

    @Override
    public T set(int index, T data) {
        Node list = value(index);
        if(list!=null){
            Object dataNode = list.data;
            list.data = data;
            return (T)dataNode;
        }
        return null;
    }

    @Override
    public T put(int index) {
        Node list = value(index);
        if (list!=null){
            return (T)list.data;
        }
        return null;
    }

    private Node value(int index){
        if(this.size==0 || this.size<=index || index<0){//排除干扰
            return null;
        } else {
            Node list = root;//获取链表
            while(index>0){
                list.node = list.node.node;
                index--;
            }
            return list;
        }
    }

    private class Node<T> {
        private T data;//保存数据
        private Node node;//存储下一个结点的地址

        private Node(T data) {
            this.data = data;
        }
    }

}
public class  SimgleLinkDemo{
    public static void main(String[]args){
        SingleLinkImpl<String> singleLink=new SingleLinkImpl<>();
        singleLink.add("A");
        singleLink.add("B");
        singleLink.add("C");
        System.out.println(singleLink.remove(1));
        System.out.println(singleLink.size());
        System.out.println(Arrays.toString(singleLink.toArray()));
    }

}
